﻿//#include "Uploader.h"
//#include "XyNet/Common/Logger.h"
//#include "XyNet/Service/Downloader.h"
//
//namespace XyNet
//{
//	Uploader::Task::Task(weak_ptr<RpcChannel> channel,
//		const Bytes& serverLink, const FileSystem::Path& uploadPath)
//		: _channel(channel)
//		, _serverLink(serverLink), _clientLink(Downloader::getPathLink(uploadPath))
//		, _name(uploadPath.getFilename().toLocal()), _uploadPath(uploadPath)
//		, _totalSize(0), _needUploadSize(0), _uploadedSize(0), _state(Prepare)
//	{
//		UploadService::CreateUploadTaskMethod method;
//		method.getRequest()->set_client_link(_clientLink);
//		method.getRequest()->set_server_link(serverLink);
//
//		try
//		{
//			auto c = _channel.lock();
//			if (!c)
//				Logger::getDefault()->logWarning("连接中断");
//			method.call(c);
//		}
//		catch (const exception& e)
//		{
//			Exception::handleException(e);
//		}
//	}
//
//	const Bytes& Uploader::Task::getServerLink() const
//	{
//		return _serverLink;
//	}
//
//	const Bytes& Uploader::Task::getClientLink() const
//	{
//		return _clientLink;
//	}
//
//	const string& Uploader::Task::getName() const
//	{
//		return _name;
//	}
//
//	const FileSystem::Path& Uploader::Task::getUploadPath() const
//	{
//		return _uploadPath;
//	}
//
//	void Uploader::Task::update(function<void(shared_ptr<Task>)> callback)
//	{
//		if (_state == Finish)
//		{
//			callback(shared_from_this());
//		}
//		else
//		{
//			shared_ptr<RpcChannel> channel;
//			try
//			{
//				channel = _channel.lock();
//				if (!channel)
//				{
//					Logger::getDefault()->logWarning("连接中断");
//					return;
//				}
//			}
//			catch (const exception& e)
//			{
//				Exception::handleException(e);
//			}
//
//			UploadService::GetUploadInfoMethod method;
//			method.getRequest()->set_link(_clientLink);
//			method.call(channel, [this, callback]
//			(shared_ptr<UploadService::GetUploadInfoMethod::Argument> argument)
//			{
//				const auto& info = argument->getResponse()->info();
//				_state = State(info.state());
//				_totalSize = info.total_size();
//				_needUploadSize = info.need_upload_size();
//				_uploadedSize = info.uploaded_size();
//
//				callback(shared_from_this());
//			});
//		}
//	}
//
//	int64 Uploader::Task::getTotalSize() const
//	{
//		XYNET_CHECK(_state != Prepare);
//		return _totalSize;
//	}
//
//	int64 Uploader::Task::getNeedUploadSize() const
//	{
//		XYNET_CHECK(_state != Prepare);
//		return _needUploadSize;
//	}
//
//	int64 Uploader::Task::getUploadedSize() const
//	{
//		XYNET_CHECK(_state != Prepare);
//		return _uploadedSize;
//	}
//
//	Uploader::Task::State Uploader::Task::getState() const
//	{
//		return _state;
//	}
//
//	//////////////////////////////////////////////////////////////////////////
//
//	Uploader::Uploader(weak_ptr<RpcChannel> channel) : _channel(channel) {}
//
//	void Uploader::createTask(const Bytes& serverLink, const FileSystem::Path& uploadPath)
//	{
//		char flag = serverLink[Downloader::getHashSize()];
//		bool isUploadFile;
//		if (flag == 'd')
//			isUploadFile = false;
//		else if (flag == 'f')
//			isUploadFile = true;
//		else
//			throw XYNET_EXCEPTION("无效的连接");
//
//		XYNET_CHECK(FileSystem::Path::isExists(uploadPath) && "上传路径不存在");
//		if (isUploadFile && FileSystem::Path::isDirectory(uploadPath))
//			throw XYNET_EXCEPTION("需要上传的是文件，却选择目录上传");
//		else if (!isUploadFile && FileSystem::Path::isFile(uploadPath))
//			throw XYNET_EXCEPTION("需要上传的是目录，却选择文件上传");
//
//		auto iter = std::find_if(_tasks.begin(), _tasks.end(), 
//			[serverLink](shared_ptr<Task> task)->bool
//		{
//			if (task->getServerLink() == serverLink)
//				return true;
//			return false;
//		});
//
//		if (iter != _tasks.end())
//			Logger::getDefault()->logWarning("任务已经存在");
//		else
//			_tasks.emplace_back(std::make_shared<Task>(_channel, serverLink, uploadPath));
//	}
//
//	void Uploader::removeFinishedTasks()
//	{
//		_tasks.erase(std::remove_if(_tasks.begin(), _tasks.end(), []
//		(shared_ptr<Task> task)->bool
//		{
//			return task->getState() == Task::Finish;
//		}), _tasks.end());
//	}
//
//	ConstIterator<shared_ptr<Uploader::Task>> Uploader::getTasksIterator() const
//	{
//		return ConstIterator<shared_ptr<Task>>::makeContainerIterator(&_tasks);
//	}
//
//	Bytes Uploader::getPathLink(const FileSystem::Path& path, bool isFile)
//	{
//		if ((isFile && FileSystem::Path::isDirectory(path)) ||
//			(!isFile && FileSystem::Path::isFile(path)))
//		{
//			FileSystem::Path::remove(path);
//		}
//
//		// f、d表示文件或目录
//		if (isFile)
//		{
//			FileSystem::Path::createDirectories(path.getParentPath());
//			return Downloader::getDirectoryHash(path.getParentPath()) + 
//				"f" + path.getFilename().toUtf8();
//		}
//		else
//		{
//			FileSystem::Path::createDirectories(path);
//			return Downloader::getDirectoryHash(path) + "d" + path.getFilename().toUtf8();
//		}
//	}
//
//}